'''
在Django REST framework (DRF)中，序列化和反序列化是两个核心概念，它们涉及到将复杂数据类型（如Django模型实例）转换为Python基本数据类型（通常是字典），
以及将这些基本数据类型转换回复杂数据类型的过程。
序列化（Serialization）
序列化是指将复杂数据类型（如Django模型实例）转换为Python基本数据类型（如字典或有序字典），这些基本数据类型可以轻松地转换为JSON、XML或其他格式，以便通过HTTP响应发送给客户端。

在DRF中，序列化通常是通过定义序列化器类（Serializer class）来完成的。序列化器类定义了如何将模型实例的字段转换为字典中的键值对。然后，你可以使用
序列化器的.data属性来获取这个字典，或者使用.serialize()方法（在旧版本中）来直接获取JSON字符串。

序列化：复杂模型实例->python基本数据类型->json
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
1、模型转换为字典：
    serializer = SnippetSerializer(snippet)
    serializer.data是一个字典，包含了序列化后的数据
2、字典（或其他python基本数据类型）转换为json
    content = JSONRenderer().render(serializer.data)

反序列化（Deserialization）
反序列化是指将接收到的客户端数据（通常是JSON或XML格式的字符串）转换为Python基本数据类型（如字典），然后再将这些基本数据类型转换回复杂数据类型（如Django模型实例）。

在DRF中，反序列化也是通过序列化器类来完成的。当你接收到客户端发送的数据时，你可以创建一个序列化器实例，并将数据作为data参数传递给它。然后，
你可以调用序列化器的.is_valid()方法来验证数据是否符合序列化器定义的字段和验证规则。如果数据有效，你可以使用.save()方法将数据保存为模型实例。

反序列化：json->python基本数据类型->复杂模型实例
import io
1、json转换为python基本数据类型：
    stream = io.BytesIO(content)
    data = JSONParser().parse(stream)  #这里就将json转换为了字典
2、python基本数据类型转换为复杂模型实例：
    deserializer = SnippetSerializer(data=data)
    deserializer.is_valid() #先调用序列化器实例的is_valid()方法，验证所接收的data的正确性
    deserializer.validated_data

其实deserializer = SnippetSerializer(data=serializer.data)也是可以的
'''

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES

class SnippetSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        '''
        以下是 validated_data 是如何生成的典型流程：

        客户端发送一个包含要创建或更新资源的字段值的请求（通常是一个JSON对象）。
        Django视图（View）接收这个请求，并将请求数据（通常是JSON数据）传递给序列化器实例。
        序列化器实例调用其 is_valid 方法来验证传入的数据。这个方法会检查数据是否符合序列化器中定义的字段类型和验证规则。
        如果数据有效，is_valid 方法返回 True，并且序列化器的 validated_data 属性被设置为一个字典，其中包含所有经过验证的字段值。
        然后，视图可以调用序列化器的 create 方法（如果定义了的话），并将 validated_data 作为参数传递给它。在 create 方法中，
        你可以使用这些数据来创建并返回一个新的模型实例。
        '''
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        '''
        instance.title = validated_data.get('title', instance.title)
        这是一个字典的get方法调用，尝试从validated_data字典中获取键为'title'的值。如果validated_data中存在'title'键，则返回其对应的值；
        如果不存在，则返回第二个参数指定的默认值，这里是instance.title
        '''
        print('instance-------::',instance)
        print('validated_data-------::',validated_data)
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance